<?php

/*------------------------------------------------
*
*   Explay Engine Content Management System.
*   Copyright © 2008 Golovdinov Alexander.
*
*-------------------------------------------------
*
*   Official site: wwww.alex-home.spb.ru/explay.html
*   Contact e-mail: golovdinov@gmail.com
*
*   GNU General Public License original source:
*   http://www.gnu.org/licenses/gpl-3.0.html
*
------------------------------------------------*/

if (!defined ('EXPLAY')) exit;

class articlesModel implements iArticlesModel {

	private $db_responce = false;
	private $list_str = '';
	private $count_arts = 0;
	public static $search_words = array (); // массив с поисковыми словами
	
	private static $instance = false;
	public static function getInstance () {
		if (self::$instance === false) self::$instance = new articlesModel;
			
		return self::$instance;
	}
	
	private function __construct () {}
	
	/**
	 * Вывод списка статей
	 */
	public function past_articles_list () {
		
		$view = new articlesView;
		$db = MySQL::getInstance();
		$controller = articlesController::getInstance ();
				
		$this->db_select_list ();
		
		if ($controller->bar == true) $controller->set_data ($view->past_bar ($controller->blog, $controller->author));
		$controller->set_data ($controller->top);
		
		$i = 1;
		
		if ($db->num_rows ($this->db_response) > 0) {
			
			// Создаем список статей
			$this->display_list ($view);
					
			// Выводим статьи...
			$controller->set_data ($this->list_str);
			unset ($this->list_str);
			
			// ...страницы
			$this->get_count ();
			
			if ($this->count_arts > $controller->number)
				$controller->set_data (past_pages($controller->start, $controller->number, $this->count_arts, articlesController::$main_url, 'page', $controller->after_url));
		}
		else $controller->set_error ('По заданным условиям статей нет!');
		
		unset ($view, $db, $controller);
		
	}
	
	/**
	 * Вывод развернутой статьи
	 */
	public function past_article () {
		
		$view = new articlesView;
		$db = MySQL::getInstance();
		$controller = articlesController::getInstance ();
	
		// Запрос
		$this->db_select_article ();
		
		if ($db->num_rows ($this->db_response) == 1) {
			
			$article = $db->fetch_array ($this->db_response);
			
			$controller->set_data ($view->display_article ($article));
		
			// Если закрытую статью просматривает автор или модератор, то показываем
			if ($article['art_visible'] == 'off' && User::$properties['user_id'] != $article['art_author'] && !is_moderator ())
				error_403 ();
			
			// комментарии
			if ($article['art_visible'] == 'on') {
				
				include $_SERVER['DOCUMENT_ROOT'].'/modules/comments/comments.class.php';
				$oComments = new commnetsList;
				$oComments->build_comments ('articles', $article['art_id'], '/articles/'.$article['art_id'].'.html');
				$controller->set_data ($oComments->show_data ());
				unset ($oComments);
				
				if ($article['art_comments'] == 'on') $controller->set_data (past_com_table ("/articles/$id.html#comments", 'articles', $article['art_id']));
			}
			
			$_SESSION['lastvisit_articles_'.$id] = time();
		}
		else error_404 ();
		
		unset ($view, $db, $controller);
	}
	
	/**
	 * Вывод облака тегов
	 */
	public function tags_cloud () {
		
		$mysql = articlesMySQL::getInstance();
		$db = MySQL::getInstance();		
		$controller = articlesController::getInstance ();
		$view = new articlesView;
		
		$controller->set_data ($view->tags_form (''));
			
		$get_tags = $mysql->get_tags ();
		$arr = array();
	
		// Формируем масив в котором ключи - уникальные тэги, а значения - их вес
		while (list ($tags) = $db->fetch_row ($get_tags)) {
			if (trim ($tags) != '') {
				$tag = explode (',', $tags);
	
				for ($i=0; $i<count($tag); $i++) {
					$stag = str_to_lower(trim($tag[$i]));
					if(isset($arr[$stag])){
						$arr[$stag]++;
					}else{
						$arr[$stag] = 1;
					}
				}
			}
		}
		
		if (count ($arr) == 0) {
			$controller->set_data (past_table ('Облако тегов статей', 'нет тегов', true));
			unset ($mysql, $db, $controller, $view);
			return;
		}
	
		arsort($arr); // сортируем по весу
		$arr = array_slice($arr, 0, 70); // срезаем 70
		ksort($arr); // сортируем по именам
		$vals = array_values($arr);
		$min = min($vals)-1; // наименьший вес - 1
		$max = max($vals); // наибольшее значение
	
		$min = $min>1?$min:1;
		$max = $max>1?$max:2;
	
		$max_size = 40; // Максимальный размер 40px
		$k = $max_size/(log($max-$min+1)); // коэфициент
	
		$content .= "<div id=\"art_tags\" class=\"cloud\">\n";
	
		// Выводим
		foreach($arr as $tag => $ves) {
			$size = log($ves+1-$min)*$k;
			$size = $size>10?$size:10;
			$size = $size<40?$size:40;
			$content .= "\n<a href=\"/articles/?tagname=".urlencode($tag)."\" style=\"font-size:{$size}px;\">{$tag}</a><sub style=\"color:rgb(200,200,200)\">".$ves."</sub> ";
		}
		$content .= "\n</div>";
	
		$controller->set_data (past_table ('Облако тегов статей', $content, true));
		
		unset ($mysql, $db, $controller, $view);
	}

	
	/*
	 * Формируем запрос на выбор сиписка статей
	 */
	private function db_select_list () {
		$mysql = articlesMySQL::getInstance();
		$controller = articlesController::getInstance ();
		
		$this->db_response = $mysql->db_select_list($controller->options_str, $controller->order, $controller->start, $controller->number);
		
		unset ($mysql, $controller);
	}
	
	
	/**
	 * Запрос на выборку одной статьи для ее отображения
	 */
	private function db_select_article () {
		$mysql = articlesMySQL::getInstance();
		$controller = articlesController::getInstance ();
		
		$this->db_response = $mysql->db_select_article ($controller->options_str);
		
		unset ($mysql, $controller);
	}
	
	
	/**
	 * Считаем кол-во статей
	 */
	private function get_count () {
		$mysql = articlesMySQL::getInstance();
		$controller = articlesController::getInstance ();
		
		$this->count_arts = $mysql->get_count ($controller->options_str);
		
		unset ($mysql, $controller);
	}
	
	/**
	 * Проверяем подключен ли пользователь к блогу
	 *
	 * @param integer $id id пользователя
	 * @return boolean
	 */
	public function in_blog ($id, $uid = 0) {
		$mysql = articlesMySQL::getInstance();
		
		if ($uid == 0) $uid = User::$properties['user_id'];
		
		$check = $mysql->in_blog ($id, $uid);
		
		if ($check == 1)
			return true;
		else
			return false;
			
		unset ($mysql);
	}
	
	/**
	 * Проверяем голосовал ли пользователь за блог
	 *
	 * @param string $voters строка с id пользователей (через запятую), голосовавших за блог
	 * @return boolean
	 */
	public function is_voted_blog ($voters) {
		$voters = explode (',', $voters);
		
		foreach ($voters as $v) {
			if (trim($v) == User::$properties['user_id']) return true;
		}
		return false;
	}
	
	/**
	 * Вывод списка статей
	 */	
	private function display_list ($view) {
		$i = 1;
		
		$view = new articlesView;
		$db = MySQL::getInstance ();
		Templater::load ('articles/list_view.tpl');
		
		while ($artiсle = $db->fetch_array ($this->db_response)) {
			$this->list_str .= $view->display_item ($artiсle, $i);
			++$i;			
		}
		
		unset ($db);
	}
	
}